home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / str.exe / STR.H < prev    next >
Text File  |  1993-03-01  |  10KB  |  319 lines

  1. //
  2. // str.h   : str class interface
  3. // Author  : Roy S. Woll
  4. //
  5. // Copyright (c) 1993 by Roy S. Woll
  6. // You may distribute this source freely as long as you leave all files
  7. // in their original form, including the copyright notice as is.
  8. //
  9. // Version 2.01     3/1/93  Support Turbo C++ (no nested class)
  10. // Version 2.00    12/1/92
  11. //
  12. #ifndef _STR_H
  13. #define _STR_H
  14.  
  15. //#define DEBUG_STR
  16.  
  17. class ostream;
  18. class istream;
  19. class dynstream;
  20. class regX;
  21.  
  22. #ifdef __TURBOC__
  23.     #ifndef __BORLANDC__
  24.         #define _SUBSTR substr
  25.     #else
  26.         #define _SUBSTR str::substr
  27.         class str {
  28.     #endif
  29. #else
  30.     #define _SUBSTR str::substr
  31.     class str {
  32. #endif
  33.  
  34.    class substr{
  35.      friend class str;
  36.  
  37.      int posReplace;
  38.      int numReplace;
  39.      str * mystr;
  40.  
  41.      substr(const str * data, int AposReplace, int AnumReplace);
  42.  
  43.      int compare(const char *) const;
  44.      int compare(const substr&) const;
  45.      int length() const;
  46.      
  47.    public:
  48.      str & operator = (const substr& s);
  49.      str & operator = (const char * s);
  50.      
  51.      str operator+(const char *) const;
  52.      str operator+(const substr&) const;
  53.      int operator==(const char *) const;
  54.      int operator<=(const char *) const;
  55.      int operator>=(const char *) const;
  56.      int operator!=(const char *) const;
  57.      int operator< (const char *) const;
  58.      int operator> (const char *) const;
  59.      int operator==(const substr&) const;
  60.      int operator<=(const substr&) const;
  61.      int operator>=(const substr&) const;
  62.      int operator!=(const substr&) const;
  63.      int operator< (const substr&) const;
  64.      int operator> (const substr&) const;
  65.      
  66.      operator str() const;
  67.    };
  68.  
  69. #ifdef __TURBOC__
  70.     #ifndef __BORLANDC__
  71.         class str {
  72.     #endif
  73. #endif
  74.  
  75.    friend class dynstreambuf;
  76.  
  77. protected:
  78.    enum {STR_DEFAULT_MEMINCR=256};
  79.    enum {ICASE=1};
  80.  
  81.  
  82. #ifdef DEBUG_STR
  83. public:
  84.    static int dynstreamCount;
  85.    static int ObjectCount;
  86.    static int AllocationCount;
  87.    static int TotalObjectCount;
  88.    static int TotalAllocationCount;
  89. #endif
  90.  
  91.    friend class substr;
  92.  
  93.  
  94.    struct strdata{
  95.      enum {STR_DEBUG_BUFSIZE=80};
  96.      int cursize;         // cursize should be defined before buf!
  97.      int curlength;       // current length of buffer
  98.      int refcount;
  99.  
  100.      dynstream * mystream;// pointer to str's stream
  101.      char strChange;      // Internal flag indicating when the length has been
  102.                           // changed by the str class.  
  103.                           // If true, stream is notified.
  104.      char buf[STR_DEBUG_BUFSIZE];
  105.                          // buf[1] is all that is required, but we allow
  106.                          //   it to be buf[80] so that the debugger can
  107.                          //   treat it as a char *.
  108.    };
  109.  
  110.  
  111.    static int defaultFlags;
  112.  
  113.    int memsize_init;     // Initial amount of memory to allocate for buffer
  114.    int memsize_incr;     // Memory expansion increment
  115.    int flags;            // Default flags for case sensitivity, etc.
  116.  
  117.    str& _assign (const char * source, int len);
  118.    str& _concat (const char * source, int len);
  119.    int _checkMemAllocation(int requiredLen=0);
  120.  
  121.    static void init(strdata *&, int, int);
  122.  
  123. protected:
  124.  
  125.    strdata * data;
  126.    char * getNewBuffer( int len, int newbufsize);
  127.    char * getNewBuffer(int newbufsize);
  128.  
  129.    void setNewBuffer(strdata * newdata, int newbufsize, int len);
  130.  
  131.    void setlength(int len) const;   // update the current length
  132.  
  133.    int strncmp(const char * s1, const char * s2, int n) const;
  134.    int strcmp(const char * s1, const char * s2) const;
  135.  
  136. //
  137. // Special constructors used by implementation
  138. //
  139.    str(const char *, const char *);
  140.    str(const char *, const _SUBSTR&);
  141.    str(const substr&, const char *);
  142.    str(const substr&, const substr&);
  143.  
  144.  
  145. public:
  146.  
  147. //
  148. // Constructors
  149. //
  150.    str(void);
  151.    str(int p_bufsize, int = STR_DEFAULT_MEMINCR);
  152.    str(const char * s, int bufsize=0, int = STR_DEFAULT_MEMINCR);
  153.    str(const str&, int bufsize=0, int = STR_DEFAULT_MEMINCR);
  154.  
  155.    virtual ~str();
  156.  
  157. //
  158. // Access Operators
  159. //
  160.    int size(void) const;        // return current memory allocated for buffer
  161.    int length(void) const;      // return current string length of buffer
  162.  
  163.    operator const char * () const;    // for implicit casting 
  164.    const char * operator()() const;           // for explicit casting
  165.    const char * operator()(int index) const;  // 
  166.  
  167. //
  168. // String substitution using substr "() syntax"
  169. //
  170.    substr operator()(int pos, int numreplace); // create substr from str
  171.    const substr operator()(int pos, int numreplace) const;
  172.  
  173. //
  174. // String search/replace member functions
  175. //
  176.    int search (const char *, int * startPtr) const;
  177.    int search (const char *, int start=0) const;
  178.    int search (const regX&, int * startPtr) const;
  179.    int search (const regX&, int start) const;
  180.    int search (const regX&, str * matchPtr=0, int start=0) const;
  181.    int search (const regX&, str * matchPtr, int * startPtr) const;
  182.  
  183.    int index (const char *, int start=0) const;
  184.    int index (const regX&, int start=0) const;
  185.    int index (const regX&, int * matchLen, int start=0) const;
  186.  
  187.  
  188.    int replace (const regX&, const char * replaceString, 
  189.                int* startPtr, int numReplacements=1);
  190.    int replace (const char * pattern, const char * replaceString, 
  191.                int* startPtr, int numReplacements=1);
  192.    int replace (const regX&, const char * replaceString, 
  193.                int start=0, int numReplacements=1);
  194.    int replace (const char * pattern, const char * replaceString, 
  195.                int start=0, int numReplacements=1);
  196.    int replaceAll (const char *, const char * replaceString, int start=0);
  197.    int replaceAll (const regX&, const char * replaceString, int start=0);
  198.  
  199.    char& operator[](int position);            // array indexing
  200.    char operator[](int position) const;       // array indexing for const
  201.  
  202.    ostream& stream(void);    // return stream for this str
  203.    ostream& stream(int);     // return stream and move put pointer
  204.  
  205. //
  206. // Assignment & Concatenation Operators
  207. //
  208.    str & operator = (const str & s);     // s = str;
  209.    str & operator = (const substr & s);  // s = substr;
  210.    str & operator = (const char * s);    // s = charptr
  211.    str & operator = (const char s);      // s = character
  212.    str & assign (const char * source, int len=0);
  213.  
  214.    str & operator += (const str & s);    // s += str
  215.    str & operator += (const substr & s); // s += substr
  216.    str & operator += (const char * s);   // s += charptr
  217.    str & operator += (const char s);     // s += char
  218.  
  219.    str & operator << (const str& s);     // s << str
  220.    str & operator << (const substr& s);  // s << substr
  221.    str & operator << (const char * s);   // s << charptr
  222.    str & operator << (const int s);      // s << int
  223.    str & operator << (const char s);     // s << char
  224.  
  225. // Manipulators
  226.    enum PadStripT {left, right, both, leading=0, trailing};
  227.    
  228.    str& strip(PadStripT t=trailing, const char * stripchar=" \t");
  229.    str& strip(PadStripT t, char stripchar);
  230.    str& pad(int padsize, PadStripT t=right, char padchar = ' ');
  231.    
  232. // Mutators
  233.    int insert(int pos, char ch);       // insert ch, return 0 if fail
  234.    int insert(int pos, const char * insertStr); 
  235.                                        // insert char *, return 0 if fail
  236.    void remove(int pos, int numdel=1); // remove numdel characters starting at
  237.                                        //   position pos
  238.  
  239.    str operator+(const str &) const;
  240.    str operator+(const substr &) const;
  241.    str operator+(const char * b) const;
  242.    str operator+(const char b) const;
  243.  
  244.    int operator==(const char *) const;  // made member functions so that
  245.    int operator<=(const char *) const;  // derived classes inherit functions
  246.    int operator>=(const char *) const;
  247.    int operator!=(const char *) const;
  248.    int operator< (const char *) const;
  249.    int operator> (const char *) const;
  250.  
  251.    int operator==(const str &) const;
  252.    int operator<=(const str &) const;
  253.    int operator>=(const str &) const;
  254.    int operator!=(const str &) const;
  255.    int operator